package com.edu.dsai.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.bean.BeanUtil;
import com.edu.dsai.constants.ResultConstants;
import com.edu.dsai.domain.User;
import com.edu.dsai.dto.LoginInput;
import com.edu.dsai.dto.LoginOutput;
import com.edu.dsai.service.UserService;
import com.edu.dsai.utils.R;
import com.edu.dsai.vo.UserVO;
import jakarta.annotation.Resource;
import org.springframework.boot.autoconfigure.graphql.GraphQlProperties;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@RestController /*告诉Spring此类为Controller*/
@RequestMapping("/user")
public class UserController {
    /*让UserController‘认识’UserService*/
    @Resource
    private UserService userService;
    @RequestMapping("/hw")
    public String test() {
        return "Hello World!";
    }
    /*
    @RequestMapping("/login")
    public UserVO login(String username, String password) throws Exception {
        // 服务端对收到的用户名进行验证，不能为null，不能为空串
        if (username.equals(null) || username.equals("")) {
            throw new Exception("请输入用户名");
        }
        // 服务端对收到的密码进行验证，不能为null，不能为空串
        if (password.equals(null) || password.equals("")) {
            throw new Exception("请输入密码");
        }
        // 用户名和密码数据是合法的，将数据传给service
        User user = userService.login(username, password);
        if (user == null) {
            throw new Exception("用户名和密码错误");
        }
        UserVO userVO = new UserVO();
        userVO.setId(user.getId());
        userVO.setUserName(user.getUserName());
        userVO.setRealName(user.getRealName());
        userVO.setEmail(user.getEmail());
        return userVO;
    }
    */
    @PostMapping("/login")
    public R<LoginOutput> login(
            @RequestBody
            @Validated
            LoginInput input) throws Exception {
        // 用户名和密码数据是合法的，将数据传给service
        User user = userService.login(input.getUsername(), input.getPassword());
        if (user == null) {
            // 抛出异常，一旦执行，后续的代码无执行机会
//            throw new Exception("用户名和密码错误");
            return R.failed("用户名和密码错误");
        }
        // 让SaToken记录登录信息，登录信息存储到Redis中
        StpUtil.login(user.getUserName());
        // 如下的代码行数太多，复杂，使用hutools工具进行简化
        // 将查询出来的user类对象数据复制到userVO中去
        LoginOutput loginOutput = BeanUtil.toBean(user, LoginOutput.class);
        // 获取用户的登录token信息
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        loginOutput.setSaTokenInfo(tokenInfo);
        return R.ok(loginOutput);
    }
    @RequestMapping("/get_data")
    @SaCheckLogin
    public String getData() {
        return "机密数据，必须登录以后才能访问！";
    }
    @GetMapping("/logout")
    @SaCheckLogin
    public void logout() {
        Object loginId = StpUtil.getLoginId();
        StpUtil.logout(loginId);
    }
    @GetMapping("/check-login")
    @SaCheckLogin
    public R<SaTokenInfo> isLogin() {
        boolean isLogin = StpUtil.isLogin();
        if (isLogin == false) {
            return R.failed(ResultConstants.NOT_LOGIN_EXCEPTION);
        }
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        return R.ok(tokenInfo);
    }
    @PostMapping("/reg")
    public void reg(
            @RequestBody
            @Validated
            LoginInput input) throws Exception {
        // 用户名和密码数据是合法的，将数据传给service
        userService.reg(input.getUsername(), input.getPassword());
    }
}
